package com.dzwww.recommend.rule.service.base.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dzwww.recommend.rule.common.api.ApiException;
import com.dzwww.recommend.rule.service.base.BaseService;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 *  基础Service实现
 * <p>
 *
 * @param <M> Dao
 * @param <T> Bean
 *            <p>
 * @author lixin
 * @date 2018/4/2 下午7:51
 *   @version 1.0
 */
@Slf4j
public class BaseServiceImpl<M extends BaseMapper<T>, T>
        extends ServiceImpl<M, T> implements BaseService<T> {

    /**
     * 查找
     *
     * @param page   分页
     * @param paramT 条件
     * @return Page<Auth>
     */
    @Override
    public IPage<T> listBy(IPage<T> page, T paramT) {
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        wrapper.setEntity(paramT);
        return this.page(page, wrapper);
    }

    /**
     * 查找
     *
     * @param paramT 条件
     * @return Page<Api>
     */
    @Override
    public List<T> listBy(T paramT) {
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        wrapper.setEntity(paramT);
        return this.list(wrapper);
    }

    /**
     * 查找一个
     *
     * @param paramT 条件
     * @return Auth
     */
    @Override
    public T getBy(T paramT) {
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        wrapper.setEntity(paramT);
        return this.getOne(wrapper);
    }

    /**
     * 计数
     *
     * @param paramT 条件
     * @return int
     */
    @Override
    public int countBy(T paramT) {
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        wrapper.setEntity(paramT);
        return this.count(wrapper);
    }

    /**
     * 添加
     * <p>
     * 注意：如果使用aop的校验
     * 在类内部方法调用需要使用(Service) AopContext.currentProxy()).add，不要使用this.add()
     * 在类外部调用不需要加AopContext.currentProxy()
     *
     * @param paramT paramT
     * @return boolean
     * @throws ApiException ApiException
     */
    @Override
    public boolean add(T paramT) throws ApiException {
        return this.save(paramT);
    }

    /**
     * 根据ID删除
     *
     * @param id id
     * @return boolean
     */
    @Override
    public boolean delById(Long id) throws ApiException {
        return this.removeById(id);
    }

    /**
     * 删除
     *
     * @param paramT 条件
     * @return boolean
     */
    @Override
    public boolean delBy(T paramT) {
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        wrapper.setEntity(paramT);
        return this.remove(wrapper);
    }

    /**
     * 按ID修改
     * <p>
     * 注意：如果使用aop的校验
     * 在类内部方法调用需要使用(Service) AopContext.currentProxy()).modifyById，不要使用this.modifyById()
     * 在类外部调用不需要加AopContext.currentProxy()
     *
     * @param paramT paramT
     * @return boolean
     * @throws ApiException ErrorMessageException
     */
    @Override
    public boolean modifyById(T paramT) throws ApiException {
        return this.updateById(paramT);
    }

}
